<!DOCTYPE HTML>
<html>

<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>Elasticsearch.Nest 教程系列 1：Nest 快速入门 | DeepThought</title>
  <meta name="google-site-verification" content="Ei6mmDdf-cJwox1RvJOeX8Dc720fqWjZQu-Ww2BjBt4">
  
  <meta name="author" content="积慕">
  
  <meta name="description" content="Nest 7 教程,Nest7.x 教程,Elasticsearch.Nest,Elasticsearch.Nest 入门, NEST 入门,NEST上手, Nest 官方文档, NEST 翻译,Elasticsearch.Nest 中文,Elasticsearch.Nest 中文文档, Nest 中文文档,NET ElasticSearch,NET es,NEST 教程, Elasticsearch 客户端,Elasticsearch 7,Elasticsearch 7.x,NEST 7,NEST 7.x">
  
  
  <meta name="keywords" content="Nest 7 教程,Nest7.x 教程,Elasticsearch.Nest,Elasticsearch.Nest 入门, NEST 入门,NEST上手, Nest 官方文档, NEST 翻译,Elasticsearch.Nest 中文,Elasticsearch.Nest 中文文档, Nest 中文文档,NET ElasticSearch,NET es,NEST 教程, Elasticsearch 客户端,Elasticsearch 7,Elasticsearch 7.x,NEST 7,NEST 7.x">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  
  <meta property="og:title" content="Elasticsearch.Nest 教程系列 1：Nest 快速入门">
  <meta property="og:site_name" content="DeepThought">

  
  <meta property="og:image" content>
  

  <link href="https://pic.zhuliang.ltd/favicon.ico" rel="shortcut icon" type="image/x-icon">
  <link rel="alternate" href="/atom.xml" title="DeepThought" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">

  <link rel="stylesheet" href="//at.alicdn.com/t/font_1187293_8fec2ou5fyx.css">

  <!-- <link rel="stylesheet" href="//cdn.bootcss.com/highlight.js/9.6.0/styles/github.min.css"> -->
  <!-- <script src="//cdn.bootcss.com/highlight.js/9.6.0/highlight.min.js"></script> -->
  <script src="/js/highlight.min.js"></script>

  <link rel="stylesheet" href="/css/markdown.css">

  <script src="/js/av-min.3.0.4.js"></script>
  <script src="/js/Valine.min.1.3.6.js"></script>

</head></html>

<body>
  <header id="header" class="inner"><div class="alignleft">
  <h1><a href="/">DeepThought</a></h1>
  <h2><a href="/">知识需沉淀，更需分享</a></h2>
</div>
<nav id="main-nav" class="alignright">
  <ul>
    
      <li><a href="/">首页</a></li>
    
      <li><a href="/about">关于我</a></li>
    
      <li><a href="/atom.xml">订阅RSS</a></li>
    
  </ul>
  <div class="clearfix"></div>
</nav>
<div class="clearfix"></div>
        </header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper"><article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title">Elasticsearch.Nest 教程系列 1：Nest 快速入门</h1>
  


      
        <time datetime="2020-01-10T09:37:01.000Z">
          create: 2020-01-10 17:37:01 | update: 2020-01-14 17:45:42
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        本文总阅读量: <span id="busuanzi_value_page_pv"></span>&nbsp;次
        <span class="blueSeparate">&nbsp;|&nbsp;</span>
        
        <span class="post-count">文章总字数:&nbsp;2k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;8&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>Elasticsearch.Net 和 NEST 对比说明：</p>
<ul>
<li>Elasticsearch 官方为 .NET 提供了 2 个官方客户端库：Elasticsearch.Net 和 NEST。</li>
<li>可以简单理解为 Elasticsearch.Net 是 NEST 的一个子集。</li>
<li>NEST 内部使用了 ElasticSearch.Net ，并通过 NEST 可以对外暴露 ElasticSearch.Net 客户端。</li>
<li>但 NEST 包含了 ElasticSearch.Net 所没有的一些高级功能，如：<ul>
<li>强类型查询 DSL：可以将所有请求和响应的对象类型转换 1:1 的.NET 类型。</li>
<li>自动转换为 CLR 的数据类型。</li>
</ul>
</li>
</ul>
<p>基本上 .NET 项目到了要使用上 ElasticSearch 的地步，直接选择 NEST 即可。</p>
<p>在使用 NEST 作为客户端的时候，建议将 ElasticClient 对象作为单例来使用。</p>
<ul>
<li>ElasticClient 被设计为线程安全。</li>
<li>ES 中的缓存是根据 ConnectionSettings 来划分的，即服务端缓存针对的是每一个  ConnectionStrings</li>
<li><strong>例外：</strong> 当你需要连接不同的 ES 集群的时候，就不要用单例了，应为不同的 ElasticClient 使用不同的 ConnectionStrings。</li>
</ul>
<h1 id="快速使用"><a href="#快速使用" class="headerlink" title="快速使用"></a>快速使用</h1><blockquote>
<ul>
<li>使用 Nest 的时候约定 Nest 版本需要跟 ElasticSearch 版本保持一致，即服务端 ES版本为 7.3.1，则 Nest 版本也要使用 7.3.1</li>
<li><strong>以下示例通过 IoC 进行注入（单例），你也可以直接通过单例模式来实现。</strong></li>
</ul>
</blockquote>
<a id="more"></a>
<h2 id="配置、连接-ElasticSearch"><a href="#配置、连接-ElasticSearch" class="headerlink" title="配置、连接 ElasticSearch"></a>配置、连接 ElasticSearch</h2><p>配置类：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class ElasticSearchSettings
{
    public string ServerUri { get; set; }
    public string DefaultIndex { get; set; } = &quot;defaultindex&quot;;
}
</code></pre>
<p>ElasticSearch 客户端：</p>
<ul>
<li><p>连接到 ElasticSearch，并设定默认索引<br></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class ElasticSearchClient : IElasticSearchRepository
{
  private readonly ElasticSearchSettings _esSettings;
  private readonly ElasticClient _client;

  public ElasticSearchClient(IOptions&lt;ElasticSearchSettings&gt; esSettings)
  {
      _esSettings = esSettings.Value;

      var settings = new ConnectionSettings(new Uri(_esSettings.ServerUri)).DefaultIndex(_esSettings.DefaultIndex);
      _client = new ElasticClient(settings);
  }

  public ElasticSearchClient(ElasticSearchSettings esSettings)
  {
      _esSettings = esSettings;
      var settings = new ConnectionSettings(new Uri(_esSettings.ServerUri)).DefaultIndex(_esSettings.DefaultIndex);
      _client = new ElasticClient(settings);
  }
}
</code></pre>
</li>
<li><p>建议增加默认索引名，不然在请求时推断索引名的时候可能会引发异常，更多关于索引名的推断见此博文<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-Index-Name-Inference.html">NEST 教程系列 9-1 转换：Index name inference | 索引名推断的3种方式</a></p>
</li>
</ul>
<h3 id="连接配置上使用密码凭证"><a href="#连接配置上使用密码凭证" class="headerlink" title="连接配置上使用密码凭证"></a>连接配置上使用密码凭证</h3><p>ElasticSearch 可以直接在 Uri 上指定密码，如下：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var uri = new Uri(&quot;http://username:password@localhost:9200&quot;)
var settings = new ConnectionConfiguration(uri);
</code></pre>
<ul>
<li>但不建议这么做，尤其是在多个节点的连接池或者能够 reseeding 的连接池上的时候。</li>
<li>**建议使用 ConnectionSettings 来设定凭证。<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-working-with-certificates.html">NEST 教程系列 2-4 连接：Working with certificates | 使用凭证连接</a></li>
</ul>
<h3 id="使用连接池"><a href="#使用连接池" class="headerlink" title="使用连接池"></a>使用连接池</h3><p>ConnectionSettings 不仅支持单地址的连接方式，同样提供了不同类型的连接池来让你配置客户端，如使用 SniffingConnectionPool 来连接集群中的 3 个 Elasticsearch 节点，客户端将使用该类型的连接池来维护集群中的可用节点列表，并会以循环的方式发送调用请求。</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var uris = new[]{
    new Uri(&quot;http://localhost:9200&quot;),
    new Uri(&quot;http://localhost:9201&quot;),
    new Uri(&quot;http://localhost:9202&quot;),};

var connectionPool = new SniffingConnectionPool(uris);var settings = new ConnectionSettings(connectionPool)
    .DefaultIndex(&quot;people&quot;);

_client = new ElasticClient(settings);
</code></pre>
<p><a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-ConfigurationOptions.html">NEST 教程系列 2-1 连接：Configuration options| 配置选项</a></p>
<h2 id="索引（Indexing）"><a href="#索引（Indexing）" class="headerlink" title="索引（Indexing）"></a>索引（Indexing）</h2><ul>
<li>这里的“索引”需理解为动词，用 indexing 来理解会更好，表示将一份文档插入到 ES 中。</li>
</ul>
<p>假设有如下类 User.cs</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">public class User
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
</code></pre>
<p>索引(Indexing)/添加 一份文档到 ES 中</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">//同步
var response = _client.IndexDocument&lt;User&gt;(new User
            {
                Id = new Guid(&quot;3a351ea1-bfc3-43df-ae12-9c89e22af144&quot;),
                FirstName = &quot;f1&quot;,
                LastName = &quot;l1&quot;
            });

//异步
var response = _client.IndexDocumentAsync&lt;User&gt;(new User
            {
                Id = new Guid(&quot;82f323e3-b5ec-486b-ac88-1bc5e47ec643&quot;),
                FirstName = &quot;f2&quot;,
                LastName = &quot;l2&quot;
            });
</code></pre>
<ul>
<li>目前提供的方法基本上都含有同步和异步版本（异步方法以 *Async 结尾）</li>
<li>IndexDocument 方法会判断添加的文档是否已经存在(根据 _id)，若存在，则添加失败。</li>
<li>NEST 会自动将 Id 属性作为 ES 中的 _id，更多关于 id 的推断方式见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-id-inference.html">NEST 教程系列 9-3 转换：Id 推断</a><ul>
<li>默认情况下，会使用 camel 命名方式进行转换，你可以使用 ConnectionSettings 对象的 .DefaultFieldNameInferrer(Func&lt;string, string&gt;) 方法来调整默认转换行为，更多关于属性的推断的见此博文：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-field-inference.html">NEST 教程系列 9-4 转换：Field 属性推断</a></li>
</ul>
</li>
</ul>
<p>最终请求地址为：</p>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">PUT  /users/_doc/3a351ea1-bfc3-43df-ae12-9c89e22af144
</code></pre>
<p><img src="https://pic.zhuliang.ltd/20200114143327.png-c" alt></p>
<h2 id="查询"><a href="#查询" class="headerlink" title="查询"></a>查询</h2><h3 id="通过类-lambda-表达式进行查询"><a href="#通过类-lambda-表达式进行查询" class="headerlink" title="通过类 lambda 表达式进行查询"></a>通过类 lambda 表达式进行查询</h3><p>通过 Search<t> 方法进行查询。</t></p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var result = _client.Search&lt;User&gt;(s=&gt;s.From(0)
                .Size(10)
                .Query(q=&gt;q.Match(m=&gt;m.Field(f=&gt;f.LastName).Query(&quot;l1&quot;))));
</code></pre>
<p>请求 URL 如下：</p>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">POST /users/_search?typed_keys=true
</code></pre>
<ul>
<li>以上搜索是基于“users”索引来进行搜寻</li>
</ul>
<p>如何在 ES 上的所有索引上进行搜索？通过 AllIndices()，如下：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var result = _client.Search&lt;User&gt;(s=&gt;s
    .AllIndices()  //指定在所有索引上进行查询
    .From(0)
    .Size(10)
    .Query(q=&gt;q.Match(m=&gt;m.Field(f=&gt;f.LastName).Query(&quot;l1&quot;))));
</code></pre>
<p>假设有如下文档：</p>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">//users 索引
&quot;hits&quot; : [
      {
        &quot;_index&quot; : &quot;users&quot;,
        &quot;_type&quot; : &quot;_doc&quot;,
        &quot;_id&quot; : &quot;3a351ea1-bfc3-43df-ae12-9c89e22af144&quot;,
        &quot;_score&quot; : 1.0,
        &quot;_source&quot; : {
          &quot;id&quot; : &quot;3a351ea1-bfc3-43df-ae12-9c89e22af144&quot;,
          &quot;firstName&quot; : &quot;f1&quot;,
          &quot;lastName&quot; : &quot;l1&quot;
        }
      },
      {
        &quot;_index&quot; : &quot;users&quot;,
        &quot;_type&quot; : &quot;_doc&quot;,
        &quot;_id&quot; : &quot;05245504-053c-431a-984f-23e16d8fbbc9&quot;,
        &quot;_score&quot; : 1.0,
        &quot;_source&quot; : {
          &quot;id&quot; : &quot;05245504-053c-431a-984f-23e16d8fbbc9&quot;,
          &quot;firstName&quot; : &quot;f2&quot;,
          &quot;lastName&quot; : &quot;l2&quot;
        }
      }
    ]
// thirdusers 索引
&quot;hits&quot; : [
  {
    &quot;_index&quot; : &quot;thirdusers&quot;,
    &quot;_type&quot; : &quot;_doc&quot;,
    &quot;_id&quot; : &quot;619ad5f8-c918-46ef-82a8-82a724ca5443&quot;,
    &quot;_score&quot; : 1.0,
    &quot;_source&quot; : {
      &quot;firstName&quot; : &quot;f1&quot;,
      &quot;lastName&quot; : &quot;l1&quot;
    }
  }
]
</code></pre>
<p>则最终可以获取到 users 和 thirdusers 索引中分别获取到 _id 为 3a351ea1-bfc3-43df-ae12-9c89e22af144 和 619ad5f8-c918-46ef-82a8-82a724ca5443 的文档信息。</p>
<p>可以通过 .AllTypes() 和 .AllIndices() 从所有 类型（types） 和 所有 索引（index）中查询数据，最终查询会生成在 /_search 请求中。关于 Type 和 Index，可分别参考：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-Documents-path.html">NEST 教程系列 9-6 转换：Document  Paths 文档路径</a>和<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-Indices-Paths.html">跳转：NEST 教程系列 9-7 转换：Indices Paths 索引路径</a></p>
<h3 id="通过查询对象进行查询"><a href="#通过查询对象进行查询" class="headerlink" title="通过查询对象进行查询"></a>通过查询对象进行查询</h3><p>通过 SearchRequest 对象进行查询。</p>
<p>例：在所有索引查询 LastName=”l1”的文档信息</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var request = new SearchRequest(Nest.Indices.All) //在所有索引上查询
{
    From = 0,
    Size = 10,
    Query = new MatchQuery
    {
        Field = Infer.Field&lt;User&gt;(f =&gt; f.LastName),
        Query = &quot;l1&quot;
    }
};
var response = _client.Search&lt;User&gt;(request);
</code></pre>
<p>生成的请求 URL 为：</p>
<p></p><p class="code-caption" data-lang="sh" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="sh">POST  /_all/_search?typed_keys=true
</code></pre>
<h3 id="通过-LowLever-属性来使用-Elasticsearch-Net-来进行查询"><a href="#通过-LowLever-属性来使用-Elasticsearch-Net-来进行查询" class="headerlink" title="通过 .LowLever 属性来使用 Elasticsearch.Net 来进行查询"></a>通过 .LowLever 属性来使用 Elasticsearch.Net 来进行查询</h3><p>使用 Elasticsearch.Net 来进行查询的契机：</p>
<ul>
<li>当客户端存在 bug，即使用上述 NEST 的 Search 和 SearchRequest 异常的时候，可以考虑用 Elasticsearch.Net 提供的查询方式。</li>
<li>当你希望用一个匿名对象或者 JSON 字符串来进行查询的时候。</li>
</ul>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var response = _client.LowLevel.Search&lt;SearchResponse&lt;User&gt;&gt;(&quot;users&quot;, PostData.Serializable(new
{
    from = 0,
    size = 10,
    query = new
    {
        match = new
        {
            lastName = &quot;l1&quot;
        }
    }
}));
</code></pre>
<h3 id="聚合查询"><a href="#聚合查询" class="headerlink" title="聚合查询"></a>聚合查询</h3><p>除了结构化和非结构化查询之外， ES 同样支持聚合（Aggregations）查询：</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var result = _client.Search&lt;User&gt;(s =&gt; s
    .Size(0) //设置为 0 ，可以让结果只包含聚合的部分：即 hits 属性中没有结果，聚合结果显示在 ”aggregations“
    .Query(q =&gt;
        q.Match(m =&gt;
            m.Field(f =&gt; f.FirstName)
                .Query(&quot;f2&quot;)))
    .Aggregations(a =&gt; //使用 terms 聚合，并指定到桶 last_name 中
        a.Terms(&quot;last_name&quot;, ta =&gt;
            ta.Field(f =&gt; f.LastName)))
    );
</code></pre>
<ul>
<li>一般使用 term 聚合来获取每个存储桶的文档数量，其中每个桶将以 lastName 作为关键字。</li>
</ul>
<p>更多关于聚合的操作可见此：<a href="https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-Writing-Aggregations.html">NEST 教程系列 8 聚合：Writing aggregations | 使用聚合</a></p>

      

      <div>
        
        <div style="background-color: rgb(255, 23, 0);user-select: auto;height: 3px;width:100%;margin-top: 40px;margin-bottom:15px;"></div>

<!-- <p>常言道：学然后知不足，教然后知困。</p>
<p>我知道你的焦虑，一起共进加油：P</p>
<p>关不关注都无所谓，会根据生活节奏紧凑度定期分享些开发经验、搬砖生涯、痛点、感悟。</p>
<p>
        <img src="https://pic.zhuliang.ltd/20191213133908.gif" alt="欢迎关注我的订阅号：P" />
</p> -->
<ul class="post-copyright" style="margin-left:0px;">
    <li class="post-copyright-author">
        <strong>本文作者：</strong>积慕
    </li>
    <li class="post-copyright-link">
        <strong>本文链接：</strong>
        <a href="/2020/01/backend/Elasticsearch-Nest-QuickStart.html" title="Elasticsearch.Nest 教程系列 1：Nest 快速入门">https://blog.zhuliang.ltd/2020/01/backend/Elasticsearch-Nest-QuickStart.html</a>
    </li>
    <li class="post-copyright-license">
        <strong>版权： </strong>
        本站文章均采用 <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/cn/" rel="external nofollow"
            target="_blank">CC BY-NC-SA 3.0 CN</a> 许可协议，请勿用于商业，转载注明出处！
    </li>
</ul>
        
      </div>
    </div>

    <footer>
      
      
  
  <div class="categories">
    <a href="/categories/backend/">backend</a>
  </div>

      
  
  <div class="tags">
    <a href="/tags/教程/">教程</a>, <a href="/tags/Elasticsearch-Nest系列/">Elasticsearch.Nest系列</a>, <a href="/tags/Elasticsearch/">Elasticsearch</a>
  </div>

      <!-- 
  <div class="addthis addthis_toolbox addthis_default_style">
    
    
      <a class="addthis_button_tweet"></a>
    
    
      <a class="addthis_button_google_plusone" g:plusone:size="medium"></a>
    
    
      <a class="addthis_button_pinterest_pinit" pi:pinit:layout="horizontal"></a>
    
    <a class="addthis_counter addthis_pill_style"></a>
  </div>
  <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js"></script>
 -->
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!-- 
<section id="comment">
  <h1 class="title">留言</h1>

  <div id="vcomments" style="background-color: #fff"></div>
  <script>
    new Valine({
      el: '#vcomments',
      appId: 'aTPKmG6tjDo3CbIXzAPzrj4X-gzGzoHsz',
      appKey: 'hNgWFneNpEcMnBJclPQnDgsd',
      notify: true,
      verify: true, //验证码
      avatar: 'monsterid', //https://valine.js.org/avatar.html
      placeholder: '请输入你的评论'
    })
  </script>
</section>
 --> <!--启用/关闭 LeanCloud 评论--></div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-category"></i>&nbsp;&nbsp;分类</h3>
  <ul class="entry">
  
    <li><a href="/categories/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/categories/PowerUser/">PowerUser</a><small>4</small></li>
  
    <li><a href="/categories/backend/">backend</a><small>57</small></li>
  
    <li><a href="/categories/frontend/">frontend</a><small>9</small></li>
  
    <li><a href="/categories/operations/">operations</a><small>5</small></li>
  
    <li><a href="/categories/提前退休/">提前退休</a><small>2</small></li>
  
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-new3"></i>&nbsp;&nbsp;最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2024/11/PowerUser/install-docker-in-pve-lxc.html">1. 通过 PVE LXC 搭建 docker 环境</a>
      </li>
    
      <li>
        <a href="/2024/11/Obsidian/obsidian-render-pie-chart.html">2. 2 套用于 obsidian 的生成时间占用饼图脚本示例，基于 templater， charts，echarts+dataview</a>
      </li>
    
      <li>
        <a href="/2024/10/PowerUser/fix-ios18-samba-readonly-issue.html">3. 解决 ios 18（包括ipadOS 18） 下通过文件(files app)连接 samba 服务器，目录变成只读权限的问题</a>
      </li>
    
      <li>
        <a href="/2023/07/operations/how-to-use-pm2.html">4. PM2 的安装、配置和使用</a>
      </li>
    
      <li>
        <a href="/2023/07/backend/expose-intranet-netcoreapi-to-internet.html">5. 通过 DDNS+显性URL 把内网部署的.NET CORE WEBAPI 项目暴露到公网中</a>
      </li>
    
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-tag"></i>&nbsp;&nbsp;标签</h3>
  <ul class="entry">
  
    <li><a href="/tags/net-core/">.net core</a><small>12</small></li>
  
    <li><a href="/tags/Debian/">Debian</a><small>2</small></li>
  
    <li><a href="/tags/Docker/">Docker</a><small>1</small></li>
  
    <li><a href="/tags/Elasticsearch/">Elasticsearch</a><small>35</small></li>
  
    <li><a href="/tags/Elasticsearch-Nest系列/">Elasticsearch.Nest系列</a><small>35</small></li>
  
    <li><a href="/tags/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/tags/PVE/">PVE</a><small>2</small></li>
  
    <li><a href="/tags/StackExchange-Redis系列/">StackExchange.Redis系列</a><small>12</small></li>
  
    <li><a href="/tags/centos/">centos</a><small>3</small></li>
  
    <li><a href="/tags/flex/">flex</a><small>1</small></li>
  
    <li><a href="/tags/ios/">ios</a><small>1</small></li>
  
    <li><a href="/tags/javascript/">javascript</a><small>1</small></li>
  
    <li><a href="/tags/linux/">linux</a><small>4</small></li>
  
    <li><a href="/tags/nginx/">nginx</a><small>2</small></li>
  
    <li><a href="/tags/nuget/">nuget</a><small>2</small></li>
  
    <li><a href="/tags/react/">react</a><small>6</small></li>
  
    <li><a href="/tags/styled-components/">styled-components</a><small>1</small></li>
  
    <li><a href="/tags/内网穿透/">内网穿透</a><small>4</small></li>
  
    <li><a href="/tags/培训讲义/">培训讲义</a><small>2</small></li>
  
    <li><a href="/tags/基础知识/">基础知识</a><small>2</small></li>
  
    <li><a href="/tags/性能优化/">性能优化</a><small>2</small></li>
  
    <li><a href="/tags/教程/">教程</a><small>64</small></li>
  
    <li><a href="/tags/理财/">理财</a><small>2</small></li>
  
    <li><a href="/tags/生命周期/">生命周期</a><small>1</small></li>
  
    <li><a href="/tags/经验/">经验</a><small>4</small></li>
  
  </ul>
</div>


  
  <script type="text/javascript" charset="utf-8" src="/js/tagcloud.js"></script>
  <script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
  <div class="widget tag">
    <h3 class="title"><i class="iconfont icon-cloud1"></i>&nbsp;&nbsp;标签云</h3>
    <div id="myCanvasContainer" class="widget tagcloud">
      <canvas width="250" height="250" id="resCanvas" style="width:100%">
        <a href="/tags/net-core/" style="font-size: 17.14px;">.net core</a> <a href="/tags/Debian/" style="font-size: 11.43px;">Debian</a> <a href="/tags/Docker/" style="font-size: 10px;">Docker</a> <a href="/tags/Elasticsearch/" style="font-size: 18.57px;">Elasticsearch</a> <a href="/tags/Elasticsearch-Nest系列/" style="font-size: 18.57px;">Elasticsearch.Nest系列</a> <a href="/tags/Obsidian/" style="font-size: 10px;">Obsidian</a> <a href="/tags/PVE/" style="font-size: 11.43px;">PVE</a> <a href="/tags/StackExchange-Redis系列/" style="font-size: 17.14px;">StackExchange.Redis系列</a> <a href="/tags/centos/" style="font-size: 12.86px;">centos</a> <a href="/tags/flex/" style="font-size: 10px;">flex</a> <a href="/tags/ios/" style="font-size: 10px;">ios</a> <a href="/tags/javascript/" style="font-size: 10px;">javascript</a> <a href="/tags/linux/" style="font-size: 14.29px;">linux</a> <a href="/tags/nginx/" style="font-size: 11.43px;">nginx</a> <a href="/tags/nuget/" style="font-size: 11.43px;">nuget</a> <a href="/tags/react/" style="font-size: 15.71px;">react</a> <a href="/tags/styled-components/" style="font-size: 10px;">styled-components</a> <a href="/tags/内网穿透/" style="font-size: 14.29px;">内网穿透</a> <a href="/tags/培训讲义/" style="font-size: 11.43px;">培训讲义</a> <a href="/tags/基础知识/" style="font-size: 11.43px;">基础知识</a> <a href="/tags/性能优化/" style="font-size: 11.43px;">性能优化</a> <a href="/tags/教程/" style="font-size: 20px;">教程</a> <a href="/tags/理财/" style="font-size: 11.43px;">理财</a> <a href="/tags/生命周期/" style="font-size: 10px;">生命周期</a> <a href="/tags/经验/" style="font-size: 14.29px;">经验</a>
      </canvas>
    </div>
  </div>




</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">

  
  &copy; 2018 - 2024 &nbsp;<a href='/about'>积慕</a>
  
  &nbsp;&nbsp;<a href='https://www.cnblogs.com/deepthought/'>我的博客园地址</a>
  &nbsp;&nbsp;finalclassic#outlook.com
</div>

<div class="clearfix"></div>
<div>
  本站主题基于：<a href='https://github.com/hexojs/hexo-theme-light' rel="external nofollow">hexo-theme-light</a>
</div>
<div id="busuanzi_container_site_pv">
  本站总访问量&nbsp;<span id="busuanzi_value_site_pv"></span>&nbsp;次
</div>
<div style="width:300px;margin:0 auto; padding:20px 0;">
  <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011702004805" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;">
    <img src="https://pic.zhuliang.ltd/20200102164648.png" style="float:left;"><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">沪公网安备 31011702004805号</p></a>
</div></footer>
  <script src="/js/jquery-2.0.3.min.js"></script>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>




<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
(function($){
  $('.fancybox').fancybox();
})(jQuery);
</script>


<script type="text/javascript">
hljs.initHighlightingOnLoad();
</script>

<!-- <script src="/js/busuanzi.pure.mini.js"></script> -->
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<script>
    var _hmt = _hmt || [];
    (function () {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?ea793b9c8d6b31df666a6bc15038e246";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>
<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>
</body>
</html>
